package com.yozinga;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.json.JSONObject;

import android.content.Intent;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.TextView;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.PolylineOptions;
import com.yozinga.fragment.FavouriteOffersFragment;
import com.yozinga.fragment.MerchantInfoFragement;
import com.yozinga.fragment.OffersFragment;
import com.yozinga.util.SharedData;

public class MerchantDetailActivity extends BaseActivity implements OnClickListener{

	GoogleMap map;
	ArrayList<LatLng> markerPoints;
	TextView tvOffers,tvmap,tvMerchantInfo;
	String mMerchantlatitude,mMerchantlogitude;
	String merchantName;
	Bundle bundle;
	SharedData mSharedData;

	SupportMapFragment merchantLocationFragment;
	@Override
	protected void onCreate(Bundle arg0) {
		super.onCreate(arg0);
		setContentView(R.layout.activity_merchantinfo);
		mSharedData = new SharedData(this);
		((ImageView)findViewById(R.id.ivHome)).setOnClickListener(this);
		bundle = getIntent().getExtras();
		merchantName = getIntent().getStringExtra("merchantName");
		mMerchantlatitude = getIntent().getStringExtra("latitude");
		mMerchantlogitude = getIntent().getStringExtra("longitude");

		//Merchant Name;
		TextView tvMerchantName = (TextView)findViewById(R.id.tvCategoryName);
		tvMerchantName.setText(merchantName);

		tvOffers = (TextView)findViewById(R.id.offers);
		tvOffers.setOnClickListener(this);

		tvMerchantInfo = (TextView)findViewById(R.id.merchantInfo);
		tvMerchantInfo.setOnClickListener(this);



		tvOffers.setBackgroundResource(R.drawable.highlightedtab);

		tvmap = (TextView)findViewById(R.id.map);
		tvmap.setOnClickListener(this);

		if(bundle.getString("ScreenName")!=null && bundle.getString("ScreenName").equals("Favourites")){
			//bundle.putString("merchantName", merchantName);
			FavouriteOffersFragment favouriteoffersFragment = new FavouriteOffersFragment();
			favouriteoffersFragment.setArguments(bundle);
			FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
			transaction.replace(R.id.flFragmentHolder, favouriteoffersFragment);
			transaction.commit();
		}else{
			OffersFragment offersFragment = new OffersFragment();
			offersFragment.setArguments(bundle);
			FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
			transaction.replace(R.id.flFragmentHolder, offersFragment);
			transaction.commit();
		}

	}

	@Override
	public void onClick(View v) {
		
		//((TextView)v).setBackgroundResource(R.drawable.highlightedtab);
		if(v.getId() == R.id.offers){

			tvmap.setBackgroundResource(R.drawable.locationbluebackground);
			tvMerchantInfo.setBackgroundResource(R.drawable.locationbluebackground);
			tvOffers.setBackgroundResource(R.drawable.highlightedtab);
			if(bundle.getString("ScreenName")!=null && bundle.getString("ScreenName").equals("Favourites")){
				//bundle.putString("merchantName", merchantName);
				FavouriteOffersFragment favouriteoffersFragment = new FavouriteOffersFragment();
				favouriteoffersFragment.setArguments(bundle);
				FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
				transaction.replace(R.id.flFragmentHolder, favouriteoffersFragment);
				transaction.commit();
			}else{
				OffersFragment offersFragment = new OffersFragment();
				offersFragment.setArguments(bundle);
				FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
				transaction.replace(R.id.flFragmentHolder, offersFragment);
				transaction.commit();
			}

		}else if(v.getId() == R.id.merchantInfo)
		{
			tvOffers.setBackgroundResource(R.drawable.locationbluebackground);
			tvmap.setBackgroundResource(R.drawable.locationbluebackground);

			tvMerchantInfo.setBackgroundResource(R.drawable.highlightedtab);
			MerchantInfoFragement merchantInfoFragment = new MerchantInfoFragement();
			merchantInfoFragment.setArguments(getIntent().getExtras());
			FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
			transaction.replace(R.id.flFragmentHolder, merchantInfoFragment);
			transaction.commit();
		}else if(v.getId() == R.id.map){
			tvMerchantInfo.setBackgroundResource(R.drawable.locationbluebackground);
			tvOffers.setBackgroundResource(R.drawable.locationbluebackground);

			tvmap.setBackgroundResource(R.drawable.highlightedtab);

			merchantLocationFragment = new SupportMapFragment();
			merchantLocationFragment.setArguments(getIntent().getExtras());
			FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
			transaction.replace(R.id.flFragmentHolder, merchantLocationFragment);
			transaction.commit();
			final Handler	handler=new Handler();
			final Runnable r = new Runnable()
			{
				public void run() 
				{
					merchantMap();
				}
			};
			handler.postDelayed(r, 1000);

			//Timer Delay
			/*Timer myTimer = new Timer();
			myTimer.schedule(new TimerTask() {
				@Override
				public void run() {
					merchantMap();
				}
			}, 1000, 0);*/
		}else if(v.getId() == R.id.ivHome){
			Intent homeIntent = null;
			homeIntent = new Intent(this,HomeActivity.class);
			homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
			startActivity(homeIntent);

		}else{
			super.onClick(v);
		}
	}

	private void merchantMap(){


		// Getting reference to SupportMapFragment of the activity_main
		//SupportMapFragment fm = (SupportMapFragment)getActivity().getSupportFragmentManager().findFragmentById(R.id.map);

		// Getting Map for the SupportMapFragment
		map = merchantLocationFragment.getMap();		

		if (map != null) {
			// Initializing 
			markerPoints = new ArrayList<LatLng>();

			Log.i("Today","Map is not null");
			// Enable MyLocation Button in the Map
			map.setMyLocationEnabled(true);

			LatLng origin = new LatLng(Double.parseDouble(mSharedData.getLatitude()), Double.parseDouble(mSharedData.getLongitude()));
			drawMarker(origin);
			//LatLng dest = new LatLng(Double.parseDouble(mMerchantlatitude),Double.parseDouble( mMerchantlogitude));
			LatLng dest = new LatLng(17.4500, 78.5000);
			drawMarker(dest);

			map.moveCamera(CameraUpdateFactory.newLatLngZoom(origin, 15));
			

			// Getting URL to the Google Directions API
			String url = getDirectionsUrl(origin, dest);

			DownloadTask downloadTask = new DownloadTask();

			// Start downloading json data from Google Directions API
			downloadTask.execute(url);
		}else{
			Log.i("Today","Map is  null");
		}


	}
	private String getDirectionsUrl(LatLng origin,LatLng dest){

		// Origin of route
		String str_origin = "origin="+origin.latitude+","+origin.longitude;

		// Destination of route
		String str_dest = "destination="+dest.latitude+","+dest.longitude;		


		// Sensor enabled
		String sensor = "sensor=false";			

		// Building the parameters to the web service
		String parameters = str_origin+"&"+str_dest+"&"+sensor;

		// Output format
		String output = "json";

		// Building the url to the web service
		String url = "https://maps.googleapis.com/maps/api/directions/"+output+"?"+parameters;


		return url;
	}

	/** A method to download json data from url */
	private String downloadUrl(String strUrl) throws IOException{
		String data = "";
		InputStream iStream = null;
		HttpURLConnection urlConnection = null;
		try{
			URL url = new URL(strUrl);

			// Creating an http connection to communicate with url 
			urlConnection = (HttpURLConnection) url.openConnection();

			// Connecting to url 
			urlConnection.connect();

			// Reading data from url 
			iStream = urlConnection.getInputStream();

			BufferedReader br = new BufferedReader(new InputStreamReader(iStream));

			StringBuffer sb  = new StringBuffer();

			String line = "";
			while( ( line = br.readLine())  != null){
				sb.append(line);
			}

			data = sb.toString();

			br.close();

		}catch(Exception e){
			Log.d("Exception while downloading url", e.toString());
		}finally{
			iStream.close();
			urlConnection.disconnect();
		}
		return data;
	}



	// Fetches data from url passed
	private class DownloadTask extends AsyncTask<String, Void, String>{			

		// Downloading data in non-ui thread
		@Override
		protected String doInBackground(String... url) {

			// For storing data from web service
			String data = "";

			try{
				// Fetching the data from web service
				data = downloadUrl(url[0]);
			}catch(Exception e){
				Log.d("Background Task",e.toString());
			}
			return data;		
		}

		// Executes in UI thread, after the execution of
		// doInBackground()
		@Override
		protected void onPostExecute(String result) {			
			super.onPostExecute(result);			

			ParserTask parserTask = new ParserTask();

			// Invokes the thread for parsing the JSON data
			parserTask.execute(result);

		}		
	}

	/** A class to parse the Google Places in JSON format */
	private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String,String>>> >{

		// Parsing the data in non-ui thread    	
		@Override
		protected List<List<HashMap<String, String>>> doInBackground(String... jsonData) {

			JSONObject jObject;	
			List<List<HashMap<String, String>>> routes = null;			           

			try{
				jObject = new JSONObject(jsonData[0]);
				DirectionsJSONParser parser = new DirectionsJSONParser();

				// Starts parsing data
				routes = parser.parse(jObject);    
			}catch(Exception e){
				e.printStackTrace();
			}
			return routes;
		}

		// Executes in UI thread, after the parsing process
		@Override
		protected void onPostExecute(List<List<HashMap<String, String>>> result) {
			ArrayList<LatLng> points = null;
			PolylineOptions lineOptions = null;
			MarkerOptions markerOptions = new MarkerOptions();

			// Traversing through all the routes
			for(int i=0;i<result.size();i++){
				points = new ArrayList<LatLng>();
				lineOptions = new PolylineOptions();

				// Fetching i-th route
				List<HashMap<String, String>> path = result.get(i);

				// Fetching all the points in i-th route
				for(int j=0;j<path.size();j++){
					HashMap<String,String> point = path.get(j);					

					double lat = Double.parseDouble(point.get("lat"));
					double lng = Double.parseDouble(point.get("lng"));
					LatLng position = new LatLng(lat, lng);	

					points.add(position);						
				}

				// Adding all the points in the route to LineOptions
				lineOptions.addAll(points);
				lineOptions.width(2);
				lineOptions.color(Color.BLUE);	

			}

			// Drawing polyline in the Google Map for the i-th route
			if(map!=null && lineOptions!=null)
			map.addPolyline(lineOptions);							
		}			
	}   

	private void drawMarker(LatLng point){
		markerPoints.add(point);

		// Creating MarkerOptions
		MarkerOptions options = new MarkerOptions();

		// Setting the position of the marker
		options.position(point);

		/** 
		 * For the start location, the color of marker is GREEN and
		 * for the end location, the color of marker is RED.
		 */
		if(markerPoints.size()==1){
			options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN));
		}else if(markerPoints.size()==2){
			options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED));
		}

		// Add new marker to the Google Map Android API V2
		map.addMarker(options);		
	}

}
